#!/bin/bash
################################################################################
# wfind - prints urls matching a given pattern
# Copyright(c) 2012 Tan Trieu
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
################################################################################


################################################################################
#  script: wfind 
#  author: Tan Trieu <tan.trieu at gmail dot com>
################################################################################
# CHANGELOG
# * [2012-01-09] Initial commit.
################################################################################

################################################################################
# wLs(string url) : list
################################################################################
function wLs {
  local url=${1}
  curl ${url} 2>/dev/null | sed \
      -e '/Parent Directory/d' \                      # ignore ..
      -e 's/.*<a href="\([0-9a-zA-Z/.-]*\).*/\1/g' \  # extract the href attr
      -e '/^[< ]/d'                                   # remove non-anchor tags
}

################################################################################
# endsWith(string src, string ending) : bool
################################################################################
function endsWith {
  local src=${1}
  local re="${2}\$"
  if [[ "${src}" =~ $re ]]; then
    echo true
  else
    echo false
  fi
}

################################################################################
# matches(string src, string pattern) : bool
################################################################################
function matches {
  local src=$( basename "${1}" )
  local re="${2}"
  if [[ "${src}" =~ $re ]]; then
    echo true
  else
    echo false
  fi
}

################################################################################
# wFind(string root, string schStr) : matchList
################################################################################
function wFind {
  local root=${1}
  local schStr=${2}

  local lsOut=( $( wLs ${root} ) )
  local entry=
  for entry in ${lsOut[@]}; do
    local isMatch=$( matches ${entry} ${schStr} )
    if [ "true" = "${isMatch}" ]; then
      echo ${root}/${entry}
      continue
    fi

    if [ "true" = $( endsWith $entry / ) ]; then
      wFind ${root}/${entry} ${schStr}
    fi
  done 
}

################################################################################
# main(string url, string searchText)
################################################################################
if [ -z "${1}" -o -z "${2}" ]; then
  echo "[usage] ${0} <url> <name>"
  exit 1
fi

wFind ${1} ${2}
